package com.ylw.tools.attach;

import com.sun.tools.attach.*;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

/**
 * 了解下VirtualMachineDemo
 *
 *  据说一个jvm对应一个VirtualMachine 通过list可以获取本机所有vm
 *  通过attach绑定目标主机
 *  使用loadAgent获取目标主机代理
 */
public class VirtualMachineDemo {

    /**
     * 获取当前机器上面的所有虚拟机
     */
    @Test
    public void testList(){
        List<VirtualMachineDescriptor> vmds = VirtualMachine.list();
        System.out.println(vmds.size());
        for(VirtualMachineDescriptor vmd: vmds){
            System.out.println(vmd);
        }
    }


    /**
     * 虚拟机如何loadAgent
     * 首先遍历寻找目标主机，然后attach到目标主机，然后loadAgent 在Agent里面修改目标System.properties
     *
     * 运行条件需要先 看firstDemo包下面的内容，然后将在编译后的内容里面生成jar包
     */
    @Test
    public  void loadAgent(){
//        JarFile.agentmain(null, (Instrumentation) new Object());
        List<VirtualMachineDescriptor> vmds = VirtualMachine.list();

        //VirtualMachineDescriptor displayName为""的虚拟机为当前线程
        // 为当前线程添加一个load一个agent  这里选择的是idea的jvm所以绑定的时候，不关闭idea经常出现jar无法删除，和设置的系统变量出席那缓存，
        // 这里的debug目测需要和tomcat一样另起一个jvm  怪不得网上一直说使用springboot
        //  使用java 命令开启一个jvm  可是看着idea的控制台 是使用java开启的一个main方法，为啥不是独立的虚拟机呢？？？
//        https://stackoverflow.com/questions/34741613/how-to-debug-a-java-agent  这个帖子的回答说了
        VirtualMachineDescriptor vmd = null;
        for(VirtualMachineDescriptor temp: vmds){
            if("".equals(temp.displayName())){
                vmd = temp;
            }
        }
        //给目标虚拟机添加agent  这里的目标虚拟机为当前测试方法
        VirtualMachine vm  = null;
        try {
            vm = VirtualMachine.attach(vmd);
            System.out.println("before loadAgent "+ System.currentTimeMillis());

            System.out.println("### "+ vm.getSystemProperties().getProperty("agent"));
//            vm.loadAgent("I:\\jbProject\\javastudy\\out\\production\\javastudy\\JarFile.jar");
//            JarFile jarFile = new JarFile(JarFileDemo.class.getProtectionDomain().getCodeSource().getLocation().getFile());
            vm.loadAgent("I:\\jbProject\\javastudy\\lib\\JarFileDemo.jar");
            Thread.sleep(3000);
            System.out.println("### "+ vm.getSystemProperties().getProperty("agent"));
            System.out.println("after loadAgent "+System.currentTimeMillis());
        } catch (AttachNotSupportedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (AgentLoadException e) {
            e.printStackTrace();
        } catch (AgentInitializationException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                vm.detach();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
